2
תגובות

פולימורפיזם ב PHP

פתח דנה כהן ,
מה הרעין של פולימורפיזם ב PHP?
אמרו לי שחובה לדעת קודם את רעיון ההורשה
אני מבין את רעיון ההורשה
יש מחלקה עם תכונות מסויימות והבן שלה יהיה לו תכונות של האב+תכונות שלה עצמה
לדוגמה מחלקת אב היא לאדמיין, יש לו שם ,סיסמא, וגישה לכל האתר, לבן יש שם סיסמא אך בשדה של הגישה יש לו גישה רק לחלק מהאתר , כך נוצר תיכנות ברור וקל יותר
פולימורפיזם , אשמח אם תפנה אותי ללינק עדכני על פולימורפיזם ב PHP
http://webmaster.org.il/articles/php-oop-overloading
נראה שהוא די מוגבל,
ב CPP לדוגמה , פולימורפיזם המטרה שלו היא לבצע פעולות לפי האובייקט המוצבע (אבל כמה שאני יודע ב PHP אין התעסקות עם מצביעים)
ב CPP מצביע מסוג האב יכול להצביע על הבן ואז אני כותב VIRTUAL בפונקציה של האב , ומפעיל פונקציה על אובייקט והיא תפעל לפי סוג האובייקט המוצבע ולא לפי סוג האובייקט עצמו
לדוגמה כמו בדוגמה שנתתי למעלה
אני עושה אובייקט מסוג אדמין שיצביע על אובייקט מסוג יוזר ,ובמחלקה גם של האדמיין וגם של היוזר עושה פונקציה שתדפיס את הרשאות הגישה שלו
במחלקת האב בפונקציה ארשום virtual
ואז ההדפסה תיהיה לפי סוג האובייקט המוצבע
השאלה איך זה בא לידי ביטוי בPHP , שאין בה פונטרים כמו ב CPP

אשמח להרחבה

כמן כן,מה בידיוק התפקיד של Interface?
אשמח לדוגמה איך זה עוזר לי כאשר אני בונה לדוגמה אתר של סרטים

תודה

2 תשובות

avatar ענה Splash ב 04 לאוקטובר 2015 #

הורשה היא לא תחום שהוא ספציפי ל C++ או ל PHP אלה נושא בתכנות מונחה עצמים ,על אף שכל שפה יכולה לממש את הנושא באופן טיפה שונה הקווים הם מאוד ברורים.
כפי שציינת הבן של המחלקה מסויימת יש לו את כל התכונות של האבא ועוד תכונות משלו.אם אתה מכיר את הנושא מ C++ אז אותו רעיון יעבוד ב PHP.
במידה ויש לך בעיה להמיר קוד C++ לקוד PHP תציג כאן את הקוד ב C++ והסבר קצר על מה שהקוד עושה.

התפקיד של interface הוא ליצור מעין "חוזה" למחלקה מסוימת ,השאלה נשאלה כבר בעבר ואתה יכול למצוא תשובה כאן - שאלה על interface

avatar ענה intval ב 04 לאוקטובר 2015 #

אינטרפייס הוא הסכם או חוזה בעולם התוכנה.


רגע, הסכם בין מי למה?
הוא עזור לך לבנות אתר סרטים באותה צורה שבה חוזה או הסכם עוזר לאדריכל לבנות בניין מגורים בגבעתיים.

בדיעבד זו אנלוגיה מדהימה. המשמעות שלה היא: חוזה כאילו עוזר, אבל לא באמת עוזר לבניה עצמה.
הוא עושה סדר ומבטיח לאדריכל שכל שאר חלקי המערכת עובדים ביניהם בצורה נכונה.
שמשרד התמ"ת יאשר את הבניה, העיריית תמשוך לשם את צינור הביוב, חברת החשמל תדליק את האור והאדריכל יקבל בסופו של דבר משכורת.

במקרה שלך, כשאתה המפתח היחידי של תוכנה קטנה
או שאתה ראש הכפר שבו אתה גם העירייה, גם חברת החשמל וגם האדריכל - כל חוזה חתום ומאושר אצל נוטריון נראה לך יותר כמו ביורוקרטיה מיותרת.

אך מחוץ לאתר שלך - עולם פיתוח התוכנה הוא בדרך כלל הרבה יותר גדול, מסורבל, על מליוני שורות קוד שעליהם עובדים עשרות, אם לא מאות מפתחים.
כאן, ללא הסכמים בין מפתחים אין שום דרך לשמור על סדר. הסכמים כאלה יכולים להתקבל בעל פה על ידי המפתחים בהפסקת הקפה.

מפתח אחד יכול לבקש מרעו, למשל, להוסיף בחלק שעליו החבר אחראי יכולת מסוימת, כמו העלאת תמונת פרופיל למשתמשים באתר.
המפתח השני שהולך להוסיף יכולת הצגת הפרופיל בכל מני מקומות באתר צריך לדעת איך לגשת לאותה תמונה. הם יכולים להסכים על שם מסוים שיתנו למשתנה כלשהו,
או על שם של עמודה בטבלה, או על פונקציה שאחד יכתוב והשני יפעיל שתחזיר נתיב של תמונה או על מקום קבוע בדיסק ששניהם יוכלו לגשת אליו.

הסכם שכזה בעל פה בדרך כלל לא חי טוב מכל מני סיבות. במיוחד במקרים של יותר משני מפתחים, כייון שמפתחים אחרים לא יודעים עליו,
והמפתחים המקוריים קודם שוכחים, אחרי זה מתפתרים ולבסוף נדרסים על ידי משאית.

בשביל שזה לא יקרה, הסכמים כאלה לא נכתבים בדם, אלא בקוד. כדי לכתוב הסכמים כאלה - קיימים האינטרפייסים.
האינטפרייס מגדיר אילו פעולות חלק אחד של התוכנה מציע לחלק אחר של התוכנה, לאיזה קלט הוא מצפה בשביל לעבוד ואיזה פלט הוא יחזיר בתמורה.

למשל במקרה הזה ההסכם יכל לכלול פונקציה אחת שמחזירה נתיב תמונה כלשהו.
בצורה הזו רשמת בקוד ששני המפתחים הפכו ארבעה קוסות קפה להחלטה להחזיר נתיב, בתמורה למספר מזהה המשתמש. (או בתמורה לשם המתשמש אם הם שתו וודקה)


איך להבין מה זה תכנות מונחה עצמים?
הדרך המועדפת עלי, שלאחר מכן מניבה תוצאות מדהימות למשך השנים, היא להסתכל על תוכנה אחת כעל אוסף של מליון תוכנות קטנות.
תוכנה אחת שאחראית על הצגה של קוד html, תוכנה אחרת שאחראית לבדיקת תקינות אימייל וסיסמה, תוכנה נוספת שאחראית לגישה למסד נתונים וכו'.
כל אותם תוכנות קטנות, שנקרא להם מחלקות לצורך הדיון, צריכות לתקשר אחת עם השניה בצורה כלשהי.

אוקי, זה לא מדויק. עיקרון האחריות היחידה אומר שהם אפילו לא צריכות לדעת על קיומן זו של זו, אך תוכנה אחת קטנה ראשית אכן צריכה לדעת.
בעולמות שונים התוכנה הראשית נקראת בצורות שונות (main, controller) אם כי כרגע לא רלוונטי.

כדי שהתוכנה הראשית תדע איך להשתמש בתת-תוכנות הקטנות, אתה צריך להסיכם עם עצמך (או עם הקולגות) אילו פעולות כל תת-תוכנה תדע לבצע, לאיזה קלט היא תצפה ואיזה פלט היא תחזיר. כאן מגיעים האינטרפייסים, שמטרתם לרשום את כל ההחלטות האלו בקוד.

אם אתה מפתח יחיד עם שני שורות קוד- אתה כנראה מקבל יותר ביורוקרטיה מאשר תועלת, אך אם אתה רוצה שהתוצאה תהיה בניין מגורים ולא רק ביוב, אתה צריך הסכמים. גם אם זה בין עצמך לעצמך.

אז מה הקשר לפולימורפיזם ותעשיית הכימיה?
לפני שהיו מחשבים, המונח פולימורפיזם תיאר משהו כזה: פולימורפיזם היא היכולת של מוצק להתקיים ביותר מצורה אחת או מבנה גביש.
דוגמה אחת יהלום וגרפיט הם שתי צורות שונות מאוד של פחמן.

בעברית פחות מדעית הכוונה היא שלמרות שזה כאילו אותו דבר - מבפנים זה שונה.
בתכנות זה אומר כמעט אותו דבר: מבחוץ אותו דבר ומבפנים - שונה.

חידה: מה זה דומה מבחוץ ושונה מבפנים?
תשובה: חברת הובלות מלט ובטון שהזמנת בתור אדריכל. מבחינתך, כל חברה שחתומה על אותו חוזה
תמורת X כסף לספק Y בטון
היא אותה חברה בדיוק. גם אם מבפנים החברות שונות לגמרי ובאחת העובדים מעדיפים לשתות קפה עלית ובאחרת מעדיפים להשתמש במשאיות גרמניות.

שני מיקרו תוכנות, שהחלטנו לקרוא להם מחלקות לדיון זה, יכולות להיות שונות לגמרי מבפנים, אך כל עוד הם חתומות על הסכם זהה - עבור שאר התוכנה הם אותו דבר.
דוגמה אחת כזאת יכולה להיות שני מיקרו תוכנות שמטרתם זיהוי המשתמש;
מיקרו תוכנה אחת יכולה לבצע זיהוי משתמש לפי שם מתשמש וסיסמה ומיקרו תוכנה אחרת יכולה לבצע זיהוי משתמש על פי מזהה פייסבוק.

מבחינת שאר חלקי התוכנה הם אותו דבר - הם מחזירות מזהה של משתמש מחובר, אך אופן הפעולה שלהם מבפנים שונה לחלוטין. אחת מבצעת שאילתות מסד נתונים והשניה מתחברת לשירות אינטרנט חיצוני ומדברת איתו בשפה שלו.

אז איפה משתמשים בזה?
בתור מפתח של תוכנה החלטת לכתוב איפשהו בקוד הסכם: כאן צירכה להיות מיקרו תוכנה שמאפשרת לזהות את המשתמש.
בזמן פיתוח התוכנה אתה עוד לא יודע איזו מיקרו תוכנה יעדיף המשתמש הסופי ולכן אתה לא יכול לרשום בקוד במפורש "כאן צריכה להיות מחלקה X"
אך אתה יכול לרשום שכאן חביית להיות מחלקה ש"יודעת לבצע זיהוי משתמש".


לרעיון ששני מיקרו תוכנות יכולות לבצע את אותה פעולה בדרכים שונות וניתן להחליף ביניהם בזמן אמת - קוראים פולימורפיזם


כמה נקודות חשובות:
א. אין קשר בין פולימורפיזם לבין virtual
ב. virtual מתייחס לדריסה בעת הורשה. כפי ששמת לב, על הורשה לא אמרתי עד עכשיו אף לא מילה. זה הוא רעיון אחרי לגמרי שלא קשור לשני אלה
ג. דוגמאות קוד ועקרונות אחרים של תכנות מונחה עצמים אני מסביר בספרי "תכנות מונחה עצמים מאפס ב-PHP"